{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32m2024-07-19 22:53:25.543\u001b[0m | \u001b[1mINFO    \u001b[0m | \u001b[36mbyzerllm.utils.connect_ray\u001b[0m:\u001b[36mconnect_cluster\u001b[0m:\u001b[36m37\u001b[0m - \u001b[1mJDK 21 will be used (/Users/allwefantasy/.auto-coder/jdk-21.0.2.jdk/Contents/Home)...\u001b[0m\n",
      "2024-07-19 22:53:25,639\tINFO worker.py:1564 -- Connecting to existing Ray cluster at address: 127.0.0.1:6379...\n",
      "2024-07-19 22:53:25,641\tINFO worker.py:1582 -- Calling ray.init() again after it has already been called.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'text': 'In the last chapter, you and I started to step through the internal workings of a transformer. This is one of the key pieces of technology inside large language models, and a lot of other tools in the modern wave of AI.', 'task': 'transcribe', 'language': 'english', 'duration': 10.0, 'segments': [{'id': 0, 'seek': 0, 'start': 0.0, 'end': 4.78000020980835, 'text': ' In the last chapter, you and I started to step through the internal workings of a transformer.', 'tokens': [50364, 682, 264, 1036, 7187, 11, 291, 293, 286, 1409, 281, 1823, 807, 264, 6920, 589, 1109, 295, 257, 31782, 13, 50586], 'temperature': 0.0, 'avg_logprob': -0.28872039914131165, 'compression_ratio': 1.4220778942108154, 'no_speech_prob': 0.016033057123422623}, {'id': 1, 'seek': 0, 'start': 4.78000020980835, 'end': 8.579999923706055, 'text': ' This is one of the key pieces of technology inside large language models,', 'tokens': [50586, 639, 307, 472, 295, 264, 2141, 3755, 295, 2899, 1854, 2416, 2856, 5245, 11, 50759], 'temperature': 0.0, 'avg_logprob': -0.28872039914131165, 'compression_ratio': 1.4220778942108154, 'no_speech_prob': 0.016033057123422623}, {'id': 2, 'seek': 0, 'start': 8.579999923706055, 'end': 9.979999542236328, 'text': ' and a lot of other tools in the modern wave of AI.', 'tokens': [50759, 293, 257, 688, 295, 661, 3873, 294, 264, 4363, 5772, 295, 7318, 13, 50867], 'temperature': 0.0, 'avg_logprob': -0.28872039914131165, 'compression_ratio': 1.4220778942108154, 'no_speech_prob': 0.016033057123422623}], 'words': [{'word': 'In', 'start': 0.0, 'end': 0.18000000715255737}, {'word': 'the', 'start': 0.18000000715255737, 'end': 0.23999999463558197}, {'word': 'last', 'start': 0.23999999463558197, 'end': 0.5400000214576721}, {'word': 'chapter', 'start': 0.5400000214576721, 'end': 0.800000011920929}, {'word': 'you', 'start': 1.0399999618530273, 'end': 1.1200000047683716}, {'word': 'and', 'start': 1.1200000047683716, 'end': 1.1799999475479126}, {'word': 'I', 'start': 1.1799999475479126, 'end': 1.3200000524520874}, {'word': 'started', 'start': 1.3200000524520874, 'end': 1.5}, {'word': 'to', 'start': 1.5, 'end': 1.8600000143051147}, {'word': 'step', 'start': 1.8600000143051147, 'end': 1.8600000143051147}, {'word': 'through', 'start': 1.8600000143051147, 'end': 2.059999942779541}, {'word': 'the', 'start': 2.059999942779541, 'end': 2.240000009536743}, {'word': 'internal', 'start': 2.240000009536743, 'end': 2.619999885559082}, {'word': 'workings', 'start': 2.619999885559082, 'end': 3.059999942779541}, {'word': 'of', 'start': 3.059999942779541, 'end': 3.319999933242798}, {'word': 'a', 'start': 3.319999933242798, 'end': 3.5399999618530273}, {'word': 'transformer', 'start': 3.5399999618530273, 'end': 3.9800000190734863}, {'word': 'This', 'start': 4.559999942779541, 'end': 4.659999847412109}, {'word': 'is', 'start': 4.659999847412109, 'end': 4.78000020980835}, {'word': 'one', 'start': 4.78000020980835, 'end': 4.920000076293945}, {'word': 'of', 'start': 4.920000076293945, 'end': 5.099999904632568}, {'word': 'the', 'start': 5.099999904632568, 'end': 5.099999904632568}, {'word': 'key', 'start': 5.099999904632568, 'end': 5.300000190734863}, {'word': 'pieces', 'start': 5.300000190734863, 'end': 5.519999980926514}, {'word': 'of', 'start': 5.519999980926514, 'end': 5.739999771118164}, {'word': 'technology', 'start': 5.739999771118164, 'end': 6.21999979019165}, {'word': 'inside', 'start': 6.21999979019165, 'end': 6.639999866485596}, {'word': 'large', 'start': 6.639999866485596, 'end': 6.940000057220459}, {'word': 'language', 'start': 6.940000057220459, 'end': 7.260000228881836}, {'word': 'models', 'start': 7.260000228881836, 'end': 7.599999904632568}, {'word': 'and', 'start': 8.0600004196167, 'end': 8.199999809265137}, {'word': 'a', 'start': 8.199999809265137, 'end': 8.34000015258789}, {'word': 'lot', 'start': 8.34000015258789, 'end': 8.420000076293945}, {'word': 'of', 'start': 8.420000076293945, 'end': 8.579999923706055}, {'word': 'other', 'start': 8.579999923706055, 'end': 8.760000228881836}, {'word': 'tools', 'start': 8.760000228881836, 'end': 8.979999542236328}, {'word': 'in', 'start': 8.979999542236328, 'end': 9.220000267028809}, {'word': 'the', 'start': 9.220000267028809, 'end': 9.34000015258789}, {'word': 'modern', 'start': 9.34000015258789, 'end': 9.520000457763672}, {'word': 'wave', 'start': 9.520000457763672, 'end': 9.739999771118164}, {'word': 'of', 'start': 9.739999771118164, 'end': 9.920000076293945}, {'word': 'AI', 'start': 9.920000076293945, 'end': 9.979999542236328}]}\n"
     ]
    }
   ],
   "source": [
    "import byzerllm\n",
    "import json\n",
    "import base64\n",
    "llm = byzerllm.ByzerLLM.from_default_model(\"openai_speech_to_text\")\n",
    "## data:audio/${tpe};base64,\n",
    "\n",
    "audio_file = \"/Users/allwefantasy/videos/output_audio.mp3\"\n",
    "\n",
    "with open(audio_file, \"rb\") as f:\n",
    "    audio = f.read()\n",
    "    audio = \"data:audio/mp3;base64,\"+base64.b64encode(audio).decode(\"utf-8\")\n",
    "\n",
    "v = llm.chat_oai(conversations=[{\n",
    "    \"role\": \"user\",\n",
    "    \"content\": json.dumps({        \n",
    "        \"audio\": audio        \n",
    "    },ensure_ascii=False)\n",
    "}])\n",
    "print(json.loads(v[0].output))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "ls -l\n"
     ]
    }
   ],
   "source": [
    "from byzerllm.utils.client import code_utils\n",
    "text_with_markdown = '''\n",
    "```shell\n",
    "ls -l\n",
    "```\n",
    "'''\n",
    "code_blocks = code_utils.extract_code(text_with_markdown)\n",
    "for code_block in code_blocks:\n",
    "    if code_block[0] == \"shell\":\n",
    "        print(code_block[1])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32m2024-08-18 22:48:12.136\u001b[0m | \u001b[1mINFO    \u001b[0m | \u001b[36mbyzerllm.utils.connect_ray\u001b[0m:\u001b[36mconnect_cluster\u001b[0m:\u001b[36m48\u001b[0m - \u001b[1mJDK 21 will be used (/Users/allwefantasy/.auto-coder/jdk-21.0.2.jdk/Contents/Home)...\u001b[0m\n",
      "2024-08-18 22:48:12,174\tINFO worker.py:1564 -- Connecting to existing Ray cluster at address: 127.0.0.1:6379...\n",
      "2024-08-18 22:48:12,185\tINFO worker.py:1740 -- Connected to Ray cluster. View the dashboard at \u001b[1m\u001b[32m127.0.0.1:8265 \u001b[39m\u001b[22m\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'text': 'In the last chapter, you and I started to step through the internal workings of a transformer. This is one of the key pieces of technology inside large language models, and a lot of other tools in the modern wave of AI.',\n",
       " 'task': 'transcribe',\n",
       " 'language': 'english',\n",
       " 'duration': 10.0,\n",
       " 'segments': [{'id': 0,\n",
       "   'seek': 0,\n",
       "   'start': 0.0,\n",
       "   'end': 4.78000020980835,\n",
       "   'text': ' In the last chapter, you and I started to step through the internal workings of a transformer.',\n",
       "   'tokens': [50364,\n",
       "    682,\n",
       "    264,\n",
       "    1036,\n",
       "    7187,\n",
       "    11,\n",
       "    291,\n",
       "    293,\n",
       "    286,\n",
       "    1409,\n",
       "    281,\n",
       "    1823,\n",
       "    807,\n",
       "    264,\n",
       "    6920,\n",
       "    589,\n",
       "    1109,\n",
       "    295,\n",
       "    257,\n",
       "    31782,\n",
       "    13,\n",
       "    50586],\n",
       "   'temperature': 0.0,\n",
       "   'avg_logprob': -0.28872039914131165,\n",
       "   'compression_ratio': 1.4220778942108154,\n",
       "   'no_speech_prob': 0.016033057123422623},\n",
       "  {'id': 1,\n",
       "   'seek': 0,\n",
       "   'start': 4.78000020980835,\n",
       "   'end': 8.579999923706055,\n",
       "   'text': ' This is one of the key pieces of technology inside large language models,',\n",
       "   'tokens': [50586,\n",
       "    639,\n",
       "    307,\n",
       "    472,\n",
       "    295,\n",
       "    264,\n",
       "    2141,\n",
       "    3755,\n",
       "    295,\n",
       "    2899,\n",
       "    1854,\n",
       "    2416,\n",
       "    2856,\n",
       "    5245,\n",
       "    11,\n",
       "    50759],\n",
       "   'temperature': 0.0,\n",
       "   'avg_logprob': -0.28872039914131165,\n",
       "   'compression_ratio': 1.4220778942108154,\n",
       "   'no_speech_prob': 0.016033057123422623},\n",
       "  {'id': 2,\n",
       "   'seek': 0,\n",
       "   'start': 8.579999923706055,\n",
       "   'end': 9.979999542236328,\n",
       "   'text': ' and a lot of other tools in the modern wave of AI.',\n",
       "   'tokens': [50759,\n",
       "    293,\n",
       "    257,\n",
       "    688,\n",
       "    295,\n",
       "    661,\n",
       "    3873,\n",
       "    294,\n",
       "    264,\n",
       "    4363,\n",
       "    5772,\n",
       "    295,\n",
       "    7318,\n",
       "    13,\n",
       "    50867],\n",
       "   'temperature': 0.0,\n",
       "   'avg_logprob': -0.28872039914131165,\n",
       "   'compression_ratio': 1.4220778942108154,\n",
       "   'no_speech_prob': 0.016033057123422623}],\n",
       " 'words': [{'word': 'In', 'start': 0.0, 'end': 0.18000000715255737},\n",
       "  {'word': 'the', 'start': 0.18000000715255737, 'end': 0.23999999463558197},\n",
       "  {'word': 'last', 'start': 0.23999999463558197, 'end': 0.5400000214576721},\n",
       "  {'word': 'chapter', 'start': 0.5400000214576721, 'end': 0.800000011920929},\n",
       "  {'word': 'you', 'start': 1.0399999618530273, 'end': 1.1200000047683716},\n",
       "  {'word': 'and', 'start': 1.1200000047683716, 'end': 1.1799999475479126},\n",
       "  {'word': 'I', 'start': 1.1799999475479126, 'end': 1.3200000524520874},\n",
       "  {'word': 'started', 'start': 1.3200000524520874, 'end': 1.5},\n",
       "  {'word': 'to', 'start': 1.5, 'end': 1.8600000143051147},\n",
       "  {'word': 'step', 'start': 1.8600000143051147, 'end': 1.8600000143051147},\n",
       "  {'word': 'through', 'start': 1.8600000143051147, 'end': 2.059999942779541},\n",
       "  {'word': 'the', 'start': 2.059999942779541, 'end': 2.240000009536743},\n",
       "  {'word': 'internal', 'start': 2.240000009536743, 'end': 2.619999885559082},\n",
       "  {'word': 'workings', 'start': 2.619999885559082, 'end': 3.059999942779541},\n",
       "  {'word': 'of', 'start': 3.059999942779541, 'end': 3.319999933242798},\n",
       "  {'word': 'a', 'start': 3.319999933242798, 'end': 3.5399999618530273},\n",
       "  {'word': 'transformer',\n",
       "   'start': 3.5399999618530273,\n",
       "   'end': 3.9800000190734863},\n",
       "  {'word': 'This', 'start': 4.559999942779541, 'end': 4.659999847412109},\n",
       "  {'word': 'is', 'start': 4.659999847412109, 'end': 4.78000020980835},\n",
       "  {'word': 'one', 'start': 4.78000020980835, 'end': 4.920000076293945},\n",
       "  {'word': 'of', 'start': 4.920000076293945, 'end': 5.099999904632568},\n",
       "  {'word': 'the', 'start': 5.099999904632568, 'end': 5.099999904632568},\n",
       "  {'word': 'key', 'start': 5.099999904632568, 'end': 5.300000190734863},\n",
       "  {'word': 'pieces', 'start': 5.300000190734863, 'end': 5.519999980926514},\n",
       "  {'word': 'of', 'start': 5.519999980926514, 'end': 5.739999771118164},\n",
       "  {'word': 'technology', 'start': 5.739999771118164, 'end': 6.21999979019165},\n",
       "  {'word': 'inside', 'start': 6.21999979019165, 'end': 6.639999866485596},\n",
       "  {'word': 'large', 'start': 6.639999866485596, 'end': 6.940000057220459},\n",
       "  {'word': 'language', 'start': 6.940000057220459, 'end': 7.260000228881836},\n",
       "  {'word': 'models', 'start': 7.260000228881836, 'end': 7.599999904632568},\n",
       "  {'word': 'and', 'start': 8.0600004196167, 'end': 8.199999809265137},\n",
       "  {'word': 'a', 'start': 8.199999809265137, 'end': 8.34000015258789},\n",
       "  {'word': 'lot', 'start': 8.34000015258789, 'end': 8.420000076293945},\n",
       "  {'word': 'of', 'start': 8.420000076293945, 'end': 8.579999923706055},\n",
       "  {'word': 'other', 'start': 8.579999923706055, 'end': 8.760000228881836},\n",
       "  {'word': 'tools', 'start': 8.760000228881836, 'end': 8.979999542236328},\n",
       "  {'word': 'in', 'start': 8.979999542236328, 'end': 9.220000267028809},\n",
       "  {'word': 'the', 'start': 9.220000267028809, 'end': 9.34000015258789},\n",
       "  {'word': 'modern', 'start': 9.34000015258789, 'end': 9.520000457763672},\n",
       "  {'word': 'wave', 'start': 9.520000457763672, 'end': 9.739999771118164},\n",
       "  {'word': 'of', 'start': 9.739999771118164, 'end': 9.920000076293945},\n",
       "  {'word': 'AI', 'start': 9.920000076293945, 'end': 9.979999542236328}]}"
      ]
     },
     "execution_count": 1,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import byzerllm\n",
    "import json\n",
    "import base64\n",
    "from byzerllm.types import AudioPath\n",
    "\n",
    "llm = byzerllm.ByzerLLM.from_default_model(\"speech_to_text\")\n",
    "\n",
    "audio_file = \"/Users/allwefantasy/videos/output_audio.mp3\"\n",
    "\n",
    "@byzerllm.prompt(llm=llm)\n",
    "def audio_to_text(audio_file: AudioPath)->str:\n",
    "    \"\"\"\n",
    "    {{ audio_file }}\n",
    "    \"\"\"\n",
    "\n",
    "v = audio_to_text(AudioPath(value=audio_file))\n",
    "json.loads(v)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "ffmpeg version 7.0 Copyright (c) 2000-2024 the FFmpeg developers\n",
      "  built with Apple clang version 15.0.0 (clang-1500.1.0.2.5)\n",
      "  configuration: --prefix=/usr/local/Cellar/ffmpeg/7.0_1 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags='-Wl,-ld_classic' --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libaribb24 --enable-libbluray --enable-libdav1d --enable-libharfbuzz --enable-libjxl --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-audiotoolbox\n",
      "  libavutil      59.  8.100 / 59.  8.100\n",
      "  libavcodec     61.  3.100 / 61.  3.100\n",
      "  libavformat    61.  1.100 / 61.  1.100\n",
      "  libavdevice    61.  1.100 / 61.  1.100\n",
      "  libavfilter    10.  1.100 / 10.  1.100\n",
      "  libswscale      8.  1.100 /  8.  1.100\n",
      "  libswresample   5.  1.100 /  5.  1.100\n",
      "  libpostproc    58.  1.100 / 58.  1.100\n",
      "Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/Users/allwefantasy/videos/output.mp4':\n",
      "  Metadata:\n",
      "    major_brand     : isom\n",
      "    minor_version   : 512\n",
      "    compatible_brands: isomiso2avc1mp41\n",
      "    encoder         : Lavf61.1.100\n",
      "  Duration: 00:26:09.15, start: 0.000000, bitrate: 2122 kb/s\n",
      "  Stream #0:0[0x1](eng): Video: h264 (High) (avc1 / 0x31637661), yuv420p(tv, bt709, progressive), 3840x2160 [SAR 1:1 DAR 16:9], 1983 kb/s, 30 fps, 30 tbr, 15360 tbn (default)\n",
      "      Metadata:\n",
      "        handler_name    : VideoHandler\n",
      "        vendor_id       : [0][0][0][0]\n",
      "        encoder         : Lavc61.3.100 libx264\n",
      "  Stream #0:1[0x2](eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 130 kb/s (default)\n",
      "      Metadata:\n",
      "        handler_name    : SoundHandler\n",
      "        vendor_id       : [0][0][0][0]\n",
      "Stream mapping:\n",
      "  Stream #0:1 (aac) -> atrim:default\n",
      "  atrim:default -> Stream #0:0 (libmp3lame)\n",
      "Press [q] to stop, [?] for help\n",
      "Output #0, mp3, to '/Users/allwefantasy/videos/output_audio.mp3':\n",
      "  Metadata:\n",
      "    major_brand     : isom\n",
      "    minor_version   : 512\n",
      "    compatible_brands: isomiso2avc1mp41\n",
      "    TSSE            : Lavf61.1.100\n",
      "  Stream #0:0: Audio: mp3, 48000 Hz, stereo, fltp\n",
      "      Metadata:\n",
      "        encoder         : Lavc61.3.100 libmp3lame\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "音频提取成功!\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[out#0/mp3 @ 0x7fce61321a00] video:0KiB audio:157KiB subtitle:0KiB other streams:0KiB global headers:0KiB muxing overhead: 0.211199%\n",
      "size=     157KiB time=00:00:10.00 bitrate= 128.7kbits/s speed=51.8x    \n"
     ]
    }
   ],
   "source": [
    "import ffmpeg\n",
    "input_video = \"/Users/allwefantasy/videos/output.mp4\"\n",
    "output_audio = \"/Users/allwefantasy/videos/output_audio.mp3\"\n",
    "\n",
    "try:\n",
    "    # 读取输入视频文件\n",
    "    stream = ffmpeg.input(input_video)\n",
    "    \n",
    "    # 提取前 10 秒音频\n",
    "    audio = stream.audio.filter('atrim', duration=10)\n",
    "    \n",
    "    # 输出到文件\n",
    "    output = ffmpeg.output(audio, output_audio)\n",
    "    \n",
    "    # 运行 FFmpeg 命令\n",
    "    ffmpeg.run(output)\n",
    "    \n",
    "    print(\"音频提取成功!\")\n",
    "except ffmpeg.Error as e:\n",
    "    print(\"An error occurred: \", e.stderr.decode())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "\u001b[32m2024-08-02 21:36:50.935\u001b[0m | \u001b[1mINFO    \u001b[0m | \u001b[36mbyzerllm.utils.connect_ray\u001b[0m:\u001b[36mconnect_cluster\u001b[0m:\u001b[36m48\u001b[0m - \u001b[1mJDK 21 will be used (/Users/allwefantasy/.auto-coder/jdk-21.0.2.jdk/Contents/Home)...\u001b[0m\n",
      "2024-08-02 21:36:51,059\tINFO worker.py:1564 -- Connecting to existing Ray cluster at address: 127.0.0.1:6379...\n",
      "2024-08-02 21:36:51,060\tINFO worker.py:1582 -- Calling ray.init() again after it has already been called.\n",
      "\u001b[32m2024-08-02 21:36:51.139\u001b[0m | \u001b[1mINFO    \u001b[0m | \u001b[36mbyzerllm.utils.connect_ray\u001b[0m:\u001b[36mconnect_cluster\u001b[0m:\u001b[36m48\u001b[0m - \u001b[1mJDK 21 will be used (/Users/allwefantasy/.auto-coder/jdk-21.0.2.jdk/Contents/Home)...\u001b[0m\n",
      "2024-08-02 21:36:51,199\tINFO worker.py:1564 -- Connecting to existing Ray cluster at address: 127.0.0.1:6379...\n",
      "2024-08-02 21:36:51,200\tINFO worker.py:1582 -- Calling ray.init() again after it has already been called.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "({'role': 'user', 'content': '你好'},)\n"
     ]
    }
   ],
   "source": [
    "import byzerllm\n",
    "model_name = \"deepseek_chat\"\n",
    "data_model_name = \"deepseek_chat\"\n",
    "data_llm = byzerllm.ByzerLLM.from_default_model(data_model_name)\n",
    "current_llm = byzerllm.ByzerLLM.from_default_model(model_name)\n",
    "current_llm.chat_oai(conversations=[{\"role\": \"user\", \"content\": \"你好\"}])\n",
    "\n",
    "a = ({\n",
    "    \"role\": \"user\",\n",
    "    \"content\": \"你好\"\n",
    "},)\n",
    "\n",
    "print(a)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "byzerllm",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
